/**
 * \file Principal.cpp
 * \brief Fichier test pour le dictionnaire
 * \author Pierre-Marc Levasseur, Simon Rodier
 * \version 0.1
 * \date juillet 2014
 */

#include<gtest/gtest.h>
#include<iostream>
#include<fstream>
#include"Dictionnaire.h"

using namespace std;
using namespace TP2P1;

TEST(Dictionnaire, similitude_motsIdentiquesEgal1)
{
	Dictionnaire d;
	std::string mot1 = "allo";
	std::string mot2 = "allo";
	ASSERT_EQ(1,d.similitude(mot1,mot2));
}

TEST(Dictionnaire, similitude_mots1LettreCompletementDifferents)
{
	Dictionnaire d;
	std::string mot1 = "a";
	std::string mot2 = "b";
	ASSERT_EQ(0.25,d.similitude(mot1,mot2));
}


TEST(Dictionnaire, similitude_motsLongsImpairsCompletementDifferentsEgal0)
{
	Dictionnaire d;
	std::string mot1 = "yyy";
	std::string mot2 = "aaa";
	ASSERT_EQ(0,d.similitude(mot1,mot2));
}

TEST(Dictionnaire, similitude_mots1LettreIdentiquesEgal1)
{
	Dictionnaire d;
	std::string mot1 = "a";
	std::string mot2 = "a";
	ASSERT_EQ(1,d.similitude(mot1,mot2));
}

TEST(Dictionnaire, similitude_motsLettresPairsPartiellementDifferentPasEgal0ou1)
{
	Dictionnaire d;
	std::string mot1 = "aaaa";
	std::string mot2 = "aaba";
	cout<<d.similitude(mot1,mot2)<<endl;
	ASSERT_FALSE(1==d.similitude(mot1,mot2));
	ASSERT_FALSE(0==d.similitude(mot1,mot2));
}

TEST(Dictionnaire, similitude_motsLettresImpairsPartiellementDifferentPasEgal0ou1)
{
	Dictionnaire d;
	std::string mot1 = "aaabb";
	std::string mot2 = "aabaa";
	cout<<d.similitude(mot1,mot2)<<endl;
	ASSERT_FALSE(1==d.similitude(mot1,mot2));
	ASSERT_FALSE(0==d.similitude(mot1,mot2));
}

TEST(Dictionnaire, similitude_motsLongueurInegalesPartiellementDifferentPasEgal0ou1)
{
	Dictionnaire d;
	std::string mot1 = "aaabb";
	std::string mot2 = "aabaab";
	cout<<d.similitude(mot1,mot2)<<endl;
	ASSERT_FALSE(1==d.similitude(mot1,mot2));
	ASSERT_FALSE(0==d.similitude(mot1,mot2));
}

TEST(Dictionnaire, similitude_premiereLettreDifferentePasEgal1)
{
	Dictionnaire d;
	std::string mot1 = "aaabb";
	std::string mot2 = "baabb";
	cout<<d.similitude(mot1,mot2)<<endl;
	ASSERT_FALSE(1==d.similitude(mot1,mot2));
}

TEST(Dictionnaire, suggereCorrections_aNEstPasUneSuggestion)
{
	Dictionnaire d;
	d.ajouteMot("english", "anglais");
	d.ajouteMot("englisa", "anglaia");
	d.ajouteMot("englisb", "anglaib");
	d.ajouteMot("englisc", "anglaic");
	d.ajouteMot("englisd", "anglaid");
	d.ajouteMot("englise", "anglaie");
	d.ajouteMot("englisf", "anglaif");
	d.ajouteMot("englisg", "anglaig");
	d.ajouteMot("englisi", "anglaih");
	d.ajouteMot("englisk", "anglaii");
	d.ajouteMot("a", "tomate");
	std::vector<std::string> suggestions = d.suggereCorrections("englisz");
	for(std::vector<std::string>::iterator it = suggestions.begin() ; it!=suggestions.end() ; it++)
	{
		ASSERT_FALSE(*it=="a");
	}
}

TEST(Dictionnaire, traduit_motEstDansLeDictionnaire_uneTraduction)
{
	Dictionnaire d;
	d.ajouteMot("english","anglais");
	std::vector<std::string> traductions = d.traduit("english");
	ASSERT_TRUE(1==traductions.size());
	ASSERT_TRUE(traductions[0]=="anglais");
}

TEST(Dictionnaire, traduit_motEstDansLeDictionnaire_deuxTraductions)
{
	Dictionnaire d;
	d.ajouteMot("tomato", "tomate");
	d.ajouteMot("tomato", "patate");
	std::vector<std::string> original;
	original.push_back("tomate");
	original.push_back("patate");
	ASSERT_TRUE(original == d.traduit("tomato"));
}

TEST(Dictionnaire, traduit_motEstDansLeDictionnaire_PlusieursMotsDansLeDictionnaire_uneTraductions)
{
	Dictionnaire d;
	d.ajouteMot("tomato", "tomate");
	d.ajouteMot("car", "auto");
	d.ajouteMot("english", "anglais");
	d.ajouteMot("red", "rouge");
	d.ajouteMot("green", "vert");
	d.ajouteMot("blue", "bleu");
	d.ajouteMot("purple", "mauve");
	d.ajouteMot("black", "noir");
	d.ajouteMot("thief", "voleur");
	d.ajouteMot("shirt", "chandail");
	d.ajouteMot("arrow", "fleche");
	d.ajouteMot("cat", "chat");
	ASSERT_TRUE("tomate" == d.traduit("tomato")[0]);
	ASSERT_TRUE("mauve" == d.traduit("purple")[0]);
}

TEST(Dictionnaire, traduit_motNestPasDansLeDictionnaire_DictionnaireVide_vecteurVide)
{
	Dictionnaire d;
	ASSERT_TRUE(d.traduit("tomato").size()==0);
}

TEST(Dictionnaire, traduit_motNestPasDansLeDictionnaire_DictionnaireAvecElements_vecteurVide)
{
	Dictionnaire d;
	d.ajouteMot("tomato", "tomate");
	ASSERT_TRUE(d.traduit("potato").size()==0);
}

TEST(Dictionnaire, traductionDuDictionnaireInitialise)
{
	ifstream fichierDictionnaire ("EnglishFrench.txt", ios::in);
	Dictionnaire d(fichierDictionnaire);
	std::vector<std::string> traductions = d.traduit("thief");
	for(std::vector<std::string>::iterator it = traductions.begin(); it!=traductions.end(); it++)
	{
		cout<<*it<<endl;
	}

//	d.afficherSymetrique();
}
